
package com.csscis.ssm.core.feature.orm.mybatis;

import java.util.ArrayList;
import java.util.List;

import org.apache.ibatis.session.RowBounds;

/**
 * Mybatis分页参数及查询结果封装. 注意所有序号从1开始.
 *
 * @param <T> Page中记录的类型.
 * @author StarZou
 * @since 2014年5月18日 下午1:34:32
 **/
public class Page<T> extends RowBounds {

    // --分页参数 --//
    protected int pageNo = 1; //页编号 : 第几页
    protected int pageSize = 15; //页大小 : 每页的数量
    protected int offset; //偏移量 : 第一条数据在表中的位置
    protected int limit; //限定数 : 每页的数量，默认值与页大小相同

    // --结果 --//
    protected List<T> result = new ArrayList<>(); //查询结果
    protected int totalCount = -1; //总条数 : 默认为-1
    protected int totalPages; //总页数

    // --计算 数据库查询的参数 : offset, limit; --//
    /**
     * 计算偏移量
     */
    private void calcOffset() {

        this.offset = ((pageNo - 1) * pageSize);
    }

    /**
     * 计算限定数
     */
    private void calcLimit() {

        this.limit = pageSize;
    }

    // -- 构造函数 --//
    public Page() {
        this.calcOffset();
        this.calcLimit();
    }

    /**
     * @param pageNo
     * @param pageSize
     */
    public Page(int pageNo, int pageSize) {
        this.pageNo = pageNo;
        this.pageSize = pageSize;
        this.calcOffset();
        this.calcLimit();
    }

    // -- 访问查询参数函数 --//
    /**
     * 获得当前页的页号,序号从1开始,默认为1.
     */
    public int getPageNo() {

        return pageNo;
    }

    /**
     * 获得每页的记录数量,默认为15.
     */
    public int getPageSize() {

        return pageSize;
    }

    /**
     * 根据pageNo和pageSize计算当前页第一条记录在总结果集中的位置,序号从1开始.
     */
    public int getFirst() {

        return ((pageNo - 1) * pageSize) + 1;
    }

    /**
     * 根据pageNo和pageSize计算当前页第一条记录在总结果集中的位置,序号从0开始.
     */
    public int getOffset() {

        return offset;
    }

    public int getLimit() {

        return limit;
    }

    // -- 访问查询结果函数 --//
    /**
     * 取得页内的记录列表.
     */
    public List<T> getResult() {

        return result;
    }

    /**
     * 设置所有记录列表.
     */
    public void setResult(final List<T> result) {

        this.result = result;
    }

    /**
     * 取得总记录数, 默认值为-1.
     */
    public int getTotalCount() {

        return totalCount;
    }

    /**
     * 设置总记录数.
     */
    public void setTotalCount(final int totalCount) {

        this.totalCount = totalCount;
        this.totalPages = this.getTotalPages();
    }

    /**
     * 根据pageSize与totalCount计算总页数, 如totalCount<0，则返回为-1.
     *
     * @return <code>int</code> 总页数；如没有记录，就返回-1
     */
    public int getTotalPages() {

        if (totalCount < 0) {
            return -1;
        }
        int pages = (int)(Math.ceil((double)totalCount / pageSize));
        return pages;
    }

}
